MotorStep V9.2 — Документация

Система управления поворотным столом · ESP32-C3 Mini · Wi-Fi AP + Web UI

ENG MotorStep

1. Назначение

MotorStep V9.2 — прошивка для управления поворотным столом на шаговом моторе через драйвер TB6600. Предназначена для производственных задач, где требуется:

  • Точное позиционирование стола в диапазоне 0…360°
  • Плавное движение (трапециевидный профиль скорости) для тяжёлых столов (50–1500 кг)
  • Автоматический поиск нуля (концевик) при старте
  • Контроль точности через внешний энкодер MBL3806 (MISMATCH)
  • Авто-выравнивание по внешнему энкодеру (AutoMove)
  • Ручное управление через энкодер HW-040 и кнопки
  • Внешнее управление через Serial (Console) и Wi-Fi (Web UI)
Архитектура V9.2: 8 независимых классов (Display, Buttons, EncoderHW040, Settings, Position, Motor, Console, WebUI) + MainState (флаги main) + Config.h (все константы). Связаны через главный файл MotorStep_v9.ino.

2. Возможности V9.2

🌐 Wi-Fi AP

ESP32 создаёт точку доступа. SSID и пароль настраиваются из консоли, хранятся в NVS.

🖥️ Web UI

Полный интерфейс: управление, индикация, плавность, контроль точности, лог.

📡 WebSocket

JSON-статус раз в секунду. Реальное время.

🎯 Точность

0.1° по MBL3806 (24000 импульсов на оборот стола при GEAR_RATIO=10).

⚡ Плавность

Трапеция: разгон, плато, торможение. Настройка через Web/Console.

🛡️ Контроль точности

Сравнение STEP ↔ MBL3806. При рассинхроне — STOP + мигание.

🎯 AutoMove

Досыл по внешнему энкодеру после остановки. Точность до 0.1°.

🏠 Поиск нуля

2 шага: пауза → отход → точный подход. Escape-зона при выходе из 0°/360°.

🛑 Мгновенный stop

Остановка за один шаг. Позиция сохраняется. STOP! — с освобождением мотора.

📟 Дисплей TM1637

Цель, угол стола, MBL3806. Режимы d1/d2. Run, EROR, BLOC/OFF, MISMATCH.

💾 NVS-память

step, findHome, accel/cruise/start, useTol, tolX10, autoMove, ssid, pass.

⚙️ Config.h

Все константы проекта в одном файле.

3. Подключение элементов

3.1. Карта пинов

GPIO Функция Что подключено Примечание
0EncoderHW040 CLKHW-040 CLKISR, CHANGE
1EncoderHW040 DTHW-040 DTISR, CHANGE
2Кнопка дисплеяКнопка (на GND)Strapping — свой опрос
3EncoderHW040 SWHW-040 SWGyverButton
4TM1637 CLKДисплей TM1637—
5TM1637 DIOДисплей TM1637—
6TB6600 STEPTB6600 PUL+Импульсы шага
7TB6600 DIRTB6600 DIR+Направление
8Концевик HOMEМеханический/индуктивныйINPUT_PULLUP, LOW = сработал
9Резерв—Свободен
10TB6600 ENATB6600 ENA+LOW = мотор включён
20MBL3806 AMBL3806 AUART0 RX — 1 кОм, INPUT_PULLUP
21MBL3806 BMBL3806 BUART0 TX — 1 кОм, INPUT_PULLUP
Внимание! GPIO 20 и 21 — UART0 (RX/TX). Serial для Console использует USB CDC, не занимает эти пины. MBL3806 работает без конфликтов.

3.2. Схема соединений

TB6600

ESP32-C3           TB6600
─────────────────────────────
GPIO 6  ──── 1кОм ──── PUL+ (STEP)
GPIO 7  ──── 1кОм ──── DIR+
GPIO 10 ──── 1кОм ──── ENA+
GND     ────────────── PUL- / DIR- / ENA- (общий)

MBL3806

ESP32-C3           MBL3806
─────────────────────────────
+5V     ────────────── VCC (красный)
GND     ────────────── GND (чёрный)
GPIO 20 ──── 1кОм ──── A (зелёный)
GPIO 21 ──── 1кОм ──── B (белый)

HW-040

ESP32-C3           HW-040
─────────────────────────────
+3.3V   ────────────── VCC
GND     ────────────── GND
GPIO 0  ────────────── CLK
GPIO 1  ────────────── DT
GPIO 3  ────────────── SW (кнопка)

TM1637

ESP32-C3           TM1637
─────────────────────────────
+5V     ────────────── VCC
GND     ────────────── GND
GPIO 4  ────────────── CLK
GPIO 5  ────────────── DIO

Кнопка дисплея

ESP32-C3
─────────────────────────────
GPIO 2 ──[Кнопка]── GND

Концевик HOME

ESP32-C3
─────────────────────────────
GPIO 8 ──[Концевик NO]── GND

3.3. Питание

ПотребительНапряжениеТокИсточник
ESP32-C3 Mini5 В (USB)~250 мАUSB или БП
TB6600 (логика)5 В~20 мАБП 5 В
TB6600 (мотор)24–48 Вдо 3 АОтдельный БП
MBL38065 В~50 мАБП 5 В
TM16375 В~30 мАБП 5 В
HW-0403.3 В~5 мАESP32
Общий GND обязателен! GND всех устройств должны быть соединены.

4. Настройки

4.1. Пины и механика

КлассФайлЧто настраивается
DisplayDisplay.cppPIN_CLK_DISP=4, PIN_DIO_DISP=5
ButtonsButtons.cppPIN_ENC_SW=3, PIN_DISP_BTN=2, PIN_HOME=8
EncoderHW040EncoderHW040.cppPIN_ENC_CLK=0, PIN_ENC_DT=1
PositionPosition.cppPIN_MBL_A=20, PIN_MBL_B=21
MotorMotor.cppPIN_STEP=6, PIN_DIR=7, PIN_ENA=10
WebUIWebUI.cppHTTP 80, WebSocket 81
Все константыConfig.hМеханика, плавность, homing, escape, MISMATCH, AutoMove, энкодер, Wi-Fi

Config.h — все параметры

// МЕХАНИКА
#define STEPS_PER_REV           800
#define GEAR_RATIO              10.0f
#define ANGLE_MIN               0
#define ANGLE_MAX               360

// ПЛАВНОСТЬ
#define DEFAULT_ACCEL_STEPS     1000
#define DEFAULT_CRUISE_DELAY_US 400
#define DEFAULT_START_DELAY_US  1000

// HOMING
#define HOME_FAST_DELAY_US      8000
#define HOME_SLOW_DELAY_US      32000
#define HOME_BACKOFF_STEPS      50
#define HOME_PAUSE_MS           1000

// ESCAPE
#define ESCAPE_ZONE_DEG         5

// MISMATCH
#define MISMATCH_CHECK_MOVING_MS 500
#define MISMATCH_CHECK_STOP_MS   1000
#define DEFAULT_TOLERANCE_X10    10
#define TOLERANCE_MIN_X10        1
#define TOLERANCE_MAX_X10        20

// AUTOMOVE
#define AUTOMOVE_TOLERANCE_X10   1
#define AUTOMOVE_INERTIA_MS      50
#define AUTOMOVE_TIMEOUT_MS      30000
#define AUTOMOVE_CHECK_MS        100
#define AUTOMOVE_MAX_ATTEMPTS    20

4.2. NVS (энергонезависимая память)

Namespace "motorstep":

КлючТипДефолтЧто значит
stepint5Текущий шаг (1..360°)
findHomebooltrueИскать ноль при старте
accelint1000Шагов на разгон/торможение
cruiseint800Задержка на плато (мкс)
startint5000Задержка на старте/стопе (мкс)
useTolboolfalseКонтроль точности
tolX10int10УТ ×10 (0.1..2.0°)
autoMoveboolfalseАвто-выравнивание по энкодеру
ssidstring"MotorStep"Имя Wi-Fi AP
passstring"newpribor"Пароль Wi-Fi AP

5. Console (Serial)

Скорость: 115200. Line Ending: Newline или Both NL & CR.

5.1. Команды

КомандаЧто делаетОтвет
move <angle>Перейти к углу (0..360)OK / BUSY
homeПоиск нуляOK
resetСброс позиции в 0OK
holdУдержание/освобождение мотораOK
stopМгновенный стоп (без сбросов)OK
stop!Стоп с ошибкой (мотор освобождён)OK
clearСброс ошибки (позиция сохраняется)OK
nextСледующий шаг (180→90→10→5→1→180)OK
setstep <n>Установить шаг 1..360 (NVS)OK
accel <n>Установить accel (NVS)OK
cruise <n>Установить cruise (NVS)OK
start <n>Установить start (NVS)OK
ut <n>Установить УТ ×10 (1..20)OK
usetol <0|1>Вкл/выкл контроль точностиOK / BUSY
usetolПереключить контрольOK / BUSY
automove <0|1>Авто-выравнивание по энкодеруOK
findhome <0|1>Поиск нуля при старте (NVS)OK
ssid <name>Задать SSID Wi-Fi AP (1..31)OK / ERROR
pass <password>Задать пароль Wi-Fi AP (8..63)OK / ERROR
pass offОткрытая сетьOK
rebootПерезагрузка (применить Wi-Fi)—
saveСохранить всё в NVSOK / BUSY
loadЗагрузить всё из NVSOK / BUSY
hb <0|1>Heartbeat вкл/выклOK
helpСписок командOK + help

5.2. Запросы

КомандаОтвет
ready?READY / BUSY
status?IDLE / MOVING
angle?Целевой угол (0..360)
motor?Угол мотора (199.0)
mbl?Угол MBL3806 (199.0)
step?Текущий шаг (1..360)
error?OK / ERROR
hold?ON / OFF
hb?ON / OFF
ut?УТ ×10 (1..20)
usetol?ON / OFF
automove?ON / OFF
findhome?ON / OFF
ssid?Текущий SSID
pass?Длина пароля (0..63)
accel? / cruise? / start?Значение параметра

Асинхронные события

СобытиеКогда
DONEМотор завершил движение (с учётом AutoMove)
READYКонтроллер свободен
HBHeartbeat (если включён)

6. Web UI (Wi-Fi)

6.1. Подключение

  1. Прошейте плату
  2. Подключитесь к Wi-Fi: SSID/пароль из NVS (по умолчанию MotorStep / newpribor)
  3. Откройте http://192.168.4.1/
  4. Индикатор ONLINE — соединение установлено

6.2. Блоки интерфейса

📊 Индикатор

ПолеЧто показывает
ЗаданоЦелевой угол
Факт (энкодер)Угол MBL3806 (199.0)
СтатусГОТОВ / ДВИЖЕНИЕ
ОшибкаНЕТ / ОШИБКА
УдержаниеДА / НЕТ
Шаг1..360°

📏 Шаг

  • ◀ НАЗАД / NEXT STEP / ВПЕРЁД ▶

🎛️ Управление

  • Поле угла + ПЕРЕЙТИ
  • 🏠 — HOME
  • STOP, СБРОС, HOLD
  • STOP!, CLEAR

⚡ Плавность

  • accel / cruise / start + ПРИМЕНИТЬ

🛡️ Контроль точности (УТ)

  • Поле УТ (0.1..2.0) + ПРИМЕНИТЬ
  • Чекбокс «Использовать контроль»
  • Чекбокс «Авто-выравнивание по энкодеру»
  • Автосинхронизация из JSON

📜 Лог событий

  • Последние 50 сообщений

7. Кнопки и энкодер

HW-040 SW (GPIO 3)

ДействиеЧто происходит
Короткий кликСмена шага
Двойной кликУдержание (BLOC / OFF)
Длинное удержаниеСброс позиции; при ошибке — сброс ошибки

GPIO 2 (кнопка дисплея)

ДействиеЧто происходит
Кликd1 ↔ d2

Энкодер HW-040

Вращение накапливает целевой угол. После паузы 1 сек — мотор едет к цели.

8. Дисплей TM1637

Режимы

РежимИндикаторФорматЧто показывает
d1d 1XXXУгол стола
d2d 2_XXXУгол MBL3806

Приоритет отображения

  1. EROR — мигает
  2. MISMATCH — мигает углом энкодера
  3. Run — во время движения
  4. S XX — 1 сек
  5. BLOC / OFF — 1 сек
  6. d1 / d2 — 1 сек
  7. Цель — 1 сек
  8. Угол

Яркость

Настраивается в setup() через display.setBrightness(b):

ЗначениеЯркостьКогда использовать
0x0f100%Максимум
0x0b~75%День (сейчас)
0x04~25%Ночью
0x01~5%Минимум

9. Компиляция

9.1. Плата

ПараметрЗначение
BoardESP32C3 Dev Module
ЧипESP32-C3
ПлатаESP32-C3 Mini V1

9.2. Библиотеки

БиблиотекаАвторДля чего
TM1637DisplayAvishay OrpazДисплей
GyverButtonAlexGyverSW энкодера
WebSocketsMarkus SattlerWebSocket-сервер

9.3. Настройки Arduino IDE

НастройкаЗначениеПочему
BoardESP32C3 Dev ModuleПравильный чип
USB CDC On BootEnabledSerial через USB
CPU Frequency160 MHzСкорость
Flash Size4MB (32Mb)Стандарт
Upload Speed921600Быстрая прошивка
JTAG AdapterDisabledНе занимает GPIO 0-5
USB DFU On BootDisabledНе нужно
USB CDC On Boot = Enabled обязателен! Без него Serial.setTxTimeoutMs(0) вызовет ошибку компиляции.

9.4. Прошивка

  1. Подключить ESP32-C3 через USB
  2. Tools → Port
  3. Upload (Ctrl+U)
  4. Если не прошивается: BOOT → RESET → отпустить RESET → отпустить BOOT → Upload
  5. После прошивки — RESET

10. Известные проблемы и особенности

Плавность vs Wi-Fi

webui.update() раз в 20 мс (не каждый loop).

Пропуски энкодера HW-040

Антидребезг 2000 мкс в ISR + REPORT_MIN_INTERVAL_MS = 50 мс.

Двойное срабатывание GPIO 2

Strapping-пин. State machine в Buttons.cpp, антидребезг 50 мс.

GPIO 20/21 (UART0)

Serial использует USB CDC, MBL3806 работает без конфликтов.

Стол долго доводит угол при AutoMove

Нормально — система досылает до 0.1°. Если слишком медленно — увеличьте ut или отключите AutoMove.

11. Проверено и однозначно не работает

ЧтоРезультатПричина
GyverButton на GPIO 2НЕ работаетStrapping. Заменено на state machine.
GyverEncoder на ESP32-C3НЕ работаетПод AVR/ESP8266. Заменено на ISR-декодер.
Точка на TM1637НЕ работаетЗаменено на _ перед числом для MBL.
PROGRESS каждые 1°НЕ работает плавноSerial блокирует loop.
webui.update() каждый loopНЕ работает плавноWi-Fi стек ест время.

12. Состав проекта

MotorStep_v9/
├── MotorStep_v9.ino       ← main
├── Config.h                ← все константы
├── MainState.h / .cpp      ← флаги main (V9.2)
├── Display.h   / .cpp      ← TM1637
├── Buttons.h   / .cpp      ← HW-040 SW + GPIO 2 + концевик
├── EncoderHW040.h / .cpp   ← HW-040 (ISR)
├── Settings.h  / .cpp      ← NVS
├── Position.h  / .cpp      ← MBL3806
├── Motor.h     / .cpp      ← шаговый мотор
├── Console.h   / .cpp      ← Serial-протокол
└── WebUI.h     / .cpp      ← Wi-Fi AP + HTTP + WebSocket
Архитектура V9.2: каждый класс — независимый модуль. Все связи — через main. Все константы — в Config.h.

13. История версий

ВерсияЧто нового
V6 Классовая архитектура, Console, NVS, GEAR_RATIO, d1/d2, Run, EROR, findHome с 4 этапами
V8 WebUI (Wi-Fi AP + HTTP + WebSocket), JSON-статус, шаг как число, findHome с паузой, stop без сбросов
V9 Контроль точности (MISMATCH), УТ, escape-зона, поиск нуля в 2 шага, команда findhome, настройки во время движения, stop/clear без сброса позиции, новый режим дисплея MISMATCH
V9.1 • Мгновенный DONE/READY при move на текущий угол
• Motor::moveTo возвращает bool
• Флаг _sendDonePending в main
• Escape-зона: порог увеличен с 1° до 5°
• Настройка Wi-Fi AP через консоль: ssid, pass, pass off, reboot
• SSID и пароль сохраняются в NVS
V9.2 • AutoMove — досыл по внешнему энкодеру после остановки мотора
• MainState — все флаги в одном классе
• X10 точность для углов: motor?/mbl? → "199.0"
• moveTo возвращает bool, мгновенный DONE на текущем угле
• Все константы в Config.h
• moveStepsSlow — медленные шаги для досыла
• syncToEncoder — синхронизация мотора с энкодером
• Яркость дисплея: 0x0b (день), 0x04 (ночь)
• AUTOMOVE_INERTIA_MS = 50 — быстрое реагирование

14. Контроль точности (MISMATCH)

Сравнение угла по STEP-импульсам с углом внешнего энкодера MBL3806. При расхождении больше УТ — сигнал о пропуске шагов.

14.1. Настройки

ПараметрЗначениеГде меняется
useTol0 / 1Консоль usetol, Web UI, NVS
tolX101..20 (0.1°..2.0°)Консоль ut, Web UI, NVS

14.2. Проверки

Во время движения — каждые 500 мс

  • Если diff × 10 > tolX10 → STOP + мигание.

После остановки — через 1000 мс

  • Если diff > 0 → мигание.

14.3. Сброс MISMATCH

  • home — после успешного поиска нуля
  • reset — сброс позиции
  • CLEAR — не сбрасывает

14.4. Индикация

  • Дисплей мигает углом энкодера, 300 мс
  • Приоритет: EROR → MISMATCH → Run

15. Escape-зона при старте из 0°/360°

Если стол в зоне концевика и получает команду ехать от него — защита не должна срабатывать сразу.

15.1. Как работает

  • При moveTo() определяется: стоим в зоне 0°/360°, замкнут концевик, едем от него.
  • Флаг _escapeZone = true.
  • Пока флаг активен — концевик игнорируется.
  • Выход:
    • концевик разомкнулся — OK;
    • пройдено ESCAPE_ZONE_DEG (5°), а концевик замкнут — ERROR.

15.2. Порог — 5°

Индуктивный концевик имеет широкую зону. 5° (≈110 шагов) достаточно для уверенного выхода. Настраивается в Config.h:

#define ESCAPE_ZONE_DEG  5

16. Поиск нуля — два шага

16.1. Шаг 1 — быстрый поиск

  • Запускается, если концевик не замкнут.
  • Мотор едет в минус, 8000 мкс/шаг.
  • Концевик замкнулся — переход к шагу 2.

16.2. Шаг 2 — пауза + отход + подход

  1. Пауза 1 сек.
  2. Отход в плюс до размыкания.
  3. +50 шагов.
  4. Медленный поиск в минус, 32000 мкс/шаг.
  5. Обнуление: _currentStepPos = 0, _absAngle = 0.

16.3. Концевик замкнут при старте

Шаг 1 пропускается. Сразу шаг 2: пауза → отход → подход.

16.4. Защита по углу

Если пройдено больше STEPS_PER_REV × GEAR_RATIO + 200 — HOME_ERROR.

16.5. Команда findhome <0|1>

Управляет поиском нуля при старте. Сохраняется в NVS. Дефолт — 1.

17. Новые команды консоли

17.1. Команды

КомандаЧто делаетОтвет
ut <n>УТ ×10 (1..20)OK
usetol <0|1>Вкл/выкл контроль точностиOK / BUSY
usetolПереключитьOK / BUSY
automove <0|1>Авто-выравнивание по энкодеруOK
findhome <0|1>Поиск нуля при стартеOK
hb <0|1>HeartbeatOK

17.2. Запросы

ЗапросОтвет
ut?1..20
usetol?ON / OFF
automove?ON / OFF
findhome?ON / OFF

17.3. Правила вызова

  • ut, automove, findhome, hb — работают всегда.
  • usetol — BUSY при automove = ON.
  • Тяжёлые (move, home, reset, hold, next, setstep, accel, cruise, start, save, load) — только когда мотор свободен.
  • stop, stop!, clear, help — работают всегда.

18. stop / stop! / clear / reset

КомандаОстанавливаетСбрасывает позициюСтавит ошибкуСинхронизирует цель
stopданетнетда
stop!данетдада
clearнетнетснимаетнет
resetдадаснимаетда (=0)
homeдапосле успехапри проваледа (=0)

19. Список доработок

19.1. Web UI — блок «Контроль точности»

СДЕЛАНО в V9

19.2. Web UI — индикация MISMATCH

ОТЛОЖЕНО

19.3. Web UI — яркость дисплея (слайдер)

ОТЛОЖЕНО

19.4. Расширенные тесты

ОТЛОЖЕНО

19.5. Wi-Fi из консоли

СДЕЛАНО в V9.1

19.6. Мгновенный DONE/READY

СДЕЛАНО в V9.1

19.7. Escape-зона 5°

СДЕЛАНО в V9.1

19.8. AutoMove

СДЕЛАНО в V9.2

19.9. MainState

СДЕЛАНО в V9.2

20. История V9 (включая V9.1)

РазделЧто нового
Контроль точностиMISMATCH, УТ, useTol, JSON, Web UI, сброс только home/reset
Escape-зонаИгнорирование концевика при выходе из 0°/360°. Порог 5°
Поиск нуля2 шага, пауза перед отходом, пропуск шага 1, команда findhome
КомандыНастройки во время движения, обновлён help
Motorstop, stop!, clear не сбрасывают позицию; reset сбрасывает всё; moveTo возвращает bool
DisplayНовый режим MISMATCH; приоритет EROR → MISMATCH → Run
Wi-Fissid/pass/reboot из консоли, хранение в NVS
DONE/READYМгновенная отправка при move на текущий угол

21. V9.1 — что нового

21.1. Мгновенный DONE/READY при совпадении угла

Команда move X, когда стол уже на X, ранее приводила к таймауту.

Решение:

  • Motor::moveTo возвращает bool.
  • При false — main ставит _sendDonePending = true.
  • В блоке DONE/READY: if ((lastBusy && !doneBusy) || _sendDonePending).

21.2. Escape-зона: порог 5°

Индуктивный концевик имеет широкую зону срабатывания. Порог в Config.h:

#define ESCAPE_ZONE_DEG  5

21.3. Настройка Wi-Fi из консоли

  • ssid <name> — имя (1..31 симв.).
  • pass <password> — пароль (8..63 симв.).
  • pass off — открытая сеть.
  • reboot — перезагрузка для применения.

22. Настройка Wi-Fi AP

22.1. Алгоритм смены сети

  1. Подключиться к COM-порту (115200) — Serial Monitor.
  2. Ввести ssid НовоеИмя и pass НовыйПароль.
  3. Ввести reboot — плата перезагрузится.
  4. После перезагрузки точка доступа создаётся с новыми параметрами.

22.2. Если забыл пароль

Настройки в NVS. Сброс — только перепрошивка. Дефолты:

  • SSID: MotorStep
  • Пароль: newpribor

22.3. Ограничения

ПараметрМинМаксПримечание
SSID131IEEE 802.11
Пароль863WPA2-PSK, ASCII

23. AutoMove — авто-выравнивание по энкодеру

Функция доводит стол до целевого угла по внешнему энкодеру MBL3806. Работает после обычного движения мотора (по шагам).

23.1. Как работает

  1. move X — мотор едет к цели по шагам.
  2. Мотор остановился. Ждём AUTOMOVE_INERTIA_MS (50 мс) — инерция стола.
  3. Читаем энкодер: diff = target − pos.
  4. Три случая:
    • |diff| ≤ 0.1° — цель достигнута → DONE.
    • |diff| ≤ tolerance — мелкая подстройка: moveStepsSlow с постоянным медленным интервалом.
    • |diff| > tolerance — большое расхождение: syncToEncoder + обычный moveTo.
  5. После каждого досыла — снова проверка. До достижения или таймаута.

23.2. Параметры (Config.h)

ПараметрЗначениеЧто значит
AUTOMOVE_TOLERANCE_X101Порог «достигли» — 0.1°
AUTOMOVE_INERTIA_MS50Пауза после остановки, мс
AUTOMOVE_TIMEOUT_MS30000Общий таймаут, мс
AUTOMOVE_CHECK_MS100Период проверки
AUTOMOVE_MAX_ATTEMPTS20Макс. число попыток

23.3. Команда

automove <0|1>   — вкл/выкл
automove?         — запрос (ON / OFF)

23.4. Взаимодействие с MISMATCH

При automove = ON — usetol автоматически выключается.

Толерантность (УТ) при automove = ON используется как порог между мелкой подстройкой и большим движением.

23.5. Пример

automove 1
ut 10          # УТ = 1.0° — порог большой/мелкой подстройки
move 90        # мотор 0→90, потом autoMove досылает до 90.0

23.6. Блокировки

  • Пока automove = ON:
    • move, home, reset, hold, usetol — BUSY.
    • ut, automove, hb, stop, stop!, clear — работают всегда.

23.7. Результаты теста

При торможении рукой (accel=1000, cruise=200):

РежимСредняя ошибкаMAX
AutoMove OFF0.07°0.1°
AutoMove ON0.02°0.1°
Улучшение точности — +71% при торможении рукой. На ненагруженном столе — без ухудшения.

24. V9.2 — что нового

24.1. AutoMove

Автоматический досыл стола до точного угла по внешнему энкодеру. Подробно — раздел 23.

24.2. MainState — флаги в одном классе

Все флаги main собраны в MainState.h/.cpp. Логика переходов внутри класса:

  • setWasMoving(v) — при false→true сбрасывает MISMATCH.
  • setAutoMoveActive(v) — при false→true стартует таймер.
  • setAutoMoveMotorStopped(v) — при false→true стартует таймер инерции.
  • setTargetAngle(a) — при изменении сбрасывает autoMove.

24.3. X10 точность для углов

Углы motor?/mbl? возвращаются строкой "199.0" (1 знак после точки). Внутри — X10.

  • getAngleX10() — X10 (0..3600) для расчётов.
  • getAngleDeg() — целые с округлением для дисплея.
  • getAngle() — удалён.

24.4. Мгновенный DONE на текущем угле

  • automove = OFF: a == motor.getAngleDeg() → DONE.
  • automove = ON: |a×10 − position.getAngleX10()| ≤ AUTOMOVE_TOLERANCE_X10 → DONE.

24.5. Config.h

Все числовые параметры — в Config.h. Менять только там.

24.6. Яркость дисплея

В setup():

//display.setBrightness(0x0f);  // максимум
display.setBrightness(0x0b);   // день
//display.setBrightness(0x04);  // ночью

24.7. Motor — новые методы

  • bool moveTo(int32_t) — возвращает false, если уже на месте.
  • bool moveStepsSlow(int32_t) — медленные шаги.
  • void syncToEncoder(int32_t) — синхронизация с энкодером.
  • getAngleX10() / getAngleDeg().

24.8. Автотест — точность OFF vs ON

motorstep_autotest.py — флаг --accuracy-step N (20° по умолчанию). Прогон круга 0..360 дважды (OFF/ON), сравнение точности. --skip-accuracy — пропустить.